不知道大家有沒有遇過以下這種情況:
先前在某個網站上註冊會員,過了一陣子後要去登入時
發現自己居然記不得密碼了!?
沒關係!現在幾乎每個網站都能讓你reset password
就算你再健忘都不怕,忘記密碼再重設密碼就好了
今天就要來實作重設密碼的功能
使用者要重設密碼的流程,大致上是這樣:
在'./models/User'建立method
需要使用到crypto module
首先要建立&加密token
再將token存到user.resetPasswordToken這個type中
同時設定token再10分鐘後到期
最後回傳未加密過的token
UserSchema.methods.getResetPasswordToken = function() {
const resetToken = crypto.randomBytes(20).toString('hex');
this.resetPasswordToken = crypto
.createHash('sha256')
.update(resetToken)
.digest('hex');
this.resetPasswordExpire = Date.now() + 10 * 60 * 1000;
return resetToken;
}
接著到'./controllers/auth'建立forgotPassword函式
透過剛剛寫的method, 將未加密過的token存在resetToken
同時儲存剛剛設定的resetPasswordToken&resetPasswordToken type
exports.forgotPassword = asyncHandler(async (req, res, next) => {
const user = await User.findOne({ email: req.body.email });
if (!user) {
return next(
new ErrorResponse('There is no user with that email', 404)
);
}
const resetToken = user.getResetPasswordToken();
await user.save({ validateBeforeSave: false });
res.status(200).json({
success: true,
data: user
});
});
明天會用到Mailtrap API與Nodemailer
各位可以先去看看官方的doc預習一下~